perm filename DLNSTA.MID[DLN,MRC] blob sn#538123 filedate 1980-09-30 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00010 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	X PDLLEN IIILIN DMLIN DDDLIN ILM EXCT FNCN ALPHBG CHNL COLM HILIN LOLIN
C00005 00003	DEVNAM DEVCHR DEVIOS NINPKT NOUPKT NORPKT NFRERR NCKERR NRCERR NSNERR NRNERR NDOERR NNSERR NRSERR NDLERR NSQERR NRPERR NCRTRN DIDS DODS DPID DIWS DOWS UUOPDB INTPDB DILIST DOLIST DXLIST DIWIN DOWIN DACK DSEQ DNUMP DNUM DREP IO%INT IO%CLS IO%EOF IO%DTM IO%CON IO%CCR IO%RDY IO%IDL IO%DLE IO%EOP IO%R1B IO%ACN IO%ODE IO%LIC
C00009 00004	DELAYP PDL HSTADR LINCNT HDABLK HSIZE SCREEN COLPOS TXTOUT DPHEAD DLNUTB DLNNUM PRJPRG JOBNAM
C00011 00005	GO
C00013 00006	GETSTA HDNODM NXTDDB NOJOB PIDLUP
C00015 00007	NOIWIN NOOWIN
C00017 00008	CLREOF
C00020 00009	NODDDM DOIII DODM DELAY NODLAY DELAY1
C00022 00010	TERPRI DECOUT OCTOUT NUMOUT NUMOU1 NUMOU2 NUMOU3 JOBOUT SIXOUT TXTSTR ...LIT
C00024 ENDMK
C⊗;
;X PDLLEN IIILIN DMLIN DDDLIN ILM EXCT FNCN ALPHBG CHNL COLM HILIN LOLIN

TITLE DLNSTAT
SUBTTL Mark Crispin, SU-AI, September 1980

; This program is a complete crock.  Enjoy it.

X=1 ? Y=2 ? Z=3 ? L=4 ? N=5 ? DDB=6 ? I=7 ? J=10 ? P=17

PDLLEN==50.				; stack size

; GETLIN bits

IIILIN==400000,,			; terminal is a III
DMLIN==	040000,,			; terminal is a DM
DDDLIN==020000,,			; terminal is a DD

; APRENB bits

ILM==	020000				; MPV occured

; Data Risc command word

DEFINE CW ?C1,B1,C2,B2,C3,B3
 <<B1←28.>\<B2←20.>\<B3←12.>\<C1←9.>\<C2←6.>\<C3←3>\4>
TERMIN

; Data Risc command names

EXCT==	0				; execute
FNCN==	1				; function, usual value bytes
	ALPHBG==6 ? ALPHA==46
CHNL==	2				; channel select
COLM==	3				; column select
HILIN==	4				; set high 5 bits of line address
LOLIN==	5				; set low 4 bits of line address
;DEVNAM DEVCHR DEVIOS NINPKT NOUPKT NORPKT NFRERR NCKERR NRCERR NSNERR NRNERR NDOERR NNSERR NRSERR NDLERR NSQERR NRPERR NCRTRN DIDS DODS DPID DIWS DOWS UUOPDB INTPDB DILIST DOLIST DXLIST DIWIN DOWIN DACK DSEQ DNUMP DNUM DREP IO%INT IO%CLS IO%EOF IO%DTM IO%CON IO%CCR IO%RDY IO%IDL IO%DLE IO%EOP IO%R1B IO%ACN IO%ODE IO%LIC

; DLN DDB stuff

DEVNAM==0				; device name
DEVCHR==1				; chars
DEVIOS==2				; I/O status
NINPKT==11				; input packets
NOUPKT==NINPKT+1			; output packets
NORPKT==NOUPKT+1			; retransmitted packets
NFRERR==NORPKT+1			; framing errors
NCKERR==NFRERR+1			; checksum errors
NRCERR==NCKERR+1			; received errors
NSNERR==NRCERR+1			; sent errors
NRNERR==NSNERR+1			; received NAK's
NDOERR==NRNERR+1			; data overruns
NNSERR==NDOERR+1			; no free storage at MAKPDB
NRSERR==NNSERR+1			; no free storage at REPFPL
NDLERR==NRSERR+1			; dialer bit the bag
NSQERR==NDLERR+1			; sequence errors
NRPERR==NSQERR+1			; redundant packets
NCRTRN==NRPERR+1			; clock-level retransmissions
DIDS==NCRTRN+1				; I-level input coroutine PC
DODS==DIDS+1				; I-level output coroutine PC
DPID==DODS+1				; two words of process ID
DIWS==DPID+2				; input window
DOWS==DIWS+1				; output window
UUOPDB==DOWS+1				; UUO PDB
INTPDB==UUOPDB+1			; I-level PDB
DILIST==INTPDB+1			; PDB input list
DOLIST==DILIST+1			; PDB output list
DXLIST==DOLIST+1			; PDB pending acknowledgement list
DIWIN==DXLIST+1				; input window space free
DOWIN==DIWIN+1				; output window space free
DACK==DOWIN+1				; last packet received
DSEQ==DACK+1				; current packet getting sent
DNUMP==DSEQ+1				; I-level pointer to phone number
DNUM==DNUMP+1				; phone number
DREP==DNUM+4				; dialer reply code

; Bits in DEVIOS

IO%INT==100				; 1.7 → interrupt in input stream
IO%CLS==200				; 1.8 → connection closing
IO%EOF==400				; 1.9 → end of file in input stream
IO%DTM==1000				; 2.1 → data missed due to slow user

IO%CON==200				; 3.8 → connection open
IO%CCR==400				; 3.9 → carrier detect on this line
IO%RDY==2000				; 4.2 → have received a good packet
IO%IDL==4000				; 4.3 → Output idle
IO%DLE==10000				; 4.4 → DLE seen at DLIINT
IO%EOP==20000				; 4.5 → RDPDUN to be run at EOP
IO%R1B==40000				; 4.6 → read one byte into DDB's DREP
IO%ACN==100000				; 4.7 → need to send acknowledgement
IO%ODE==200000				; 4.8 → need to output an additional DLE
IO%LIC==400000				; 4.9 → locally initiated connect
;DELAYP PDL HSTADR LINCNT HDABLK HSIZE SCREEN COLPOS TXTOUT DPHEAD DLNUTB DLNNUM PRJPRG JOBNAM

; Data area

DELAYP:	BLOCK 1				; -1 → don't delay
PDL:	BLOCK PDLLEN			; stack
HSTADR:	BLOCK 1				; where host table begins
LINCNT:	BLOCK 1				; line count
HDABLK:	BLOCK 13			; terminal location block
HSIZE:	BLOCK 1				; horizontal size
SCREEN:	BLOCK 1				; display screen image pointer

; Display program stuff

COLPOS:	CW COLM,2,HILIN,1,LOLIN,10	; second column, second line
TXTOUT:	CW FNCN,ALPHA,CHNL,0,FNCN,ALPHA	; text output

DPHEAD:	200000,,			; double field mode
	0				; size
	0
	0				; address of low order line select for DD

; Monitor pointers

DLNUTB:	(I)				; Dialnet unit/DDB conversion table
DLNNUM:	BLOCK 1				; number of Dialnetses
PRJPRG:	(J)				; PPN
JOBNAM:	(J)				; program name

; Macro to output performance statistics

DEFINE PERF VAR,STRING/
 JSP Y,TXTSTR
  ASCIZ/STRING:/
 MOVEI I,1
 MOVE DDB,@DLNUTB
 MOVE Y,VAR+400000(DDB)
 MOVEI N,8.
 PUSHJ P,DECOUT
 CAME I,DLNNUM
  AOJA I,.-5
 PUSHJ P,TERPRI
TERMIN
;GO

GO:	JFCL
	RESET
	MOVE P,[PDL(-PDLLEN)]
	MOVE JOBFF
	HRRM DPHEAD
	MOVEM DPHEAD+3
	AOS DPHEAD+3
	ADDI 2
	MOVEM SCREEN

; Make sure we never lose with MPV

	MOVEI [	MOVE JOBREL
		ADDI 2000		; another K of core, please
		CORE
		 JRST 4,.
		LOCK
		JRST GETSTA]		; restart status
	MOVEM JOBAPR
	MOVEI ILM
	APRENB
	LOCK				; ensure fast response

; Map the monitor in

	MOVSI 377777
	SETPR2
	 JRST 4,.-1

; Snarf up some monitor symbols

	MOVEI [.RSQZ 0,DLNUTB ? 0]
	.SYML
	 JRST [	OUTSTR [ASCIZ/No Dialnetses!/]
		EXIT]
	ADDI 377777
	HRRM DLNUTB
	MOVEI [.RSQZ 0,DLNNUM ? 0]
	.SYML
	 JRST 4,.-1
	MOVEM DLNNUM

	MOVE 400211			; PRJPRG
	ADDI 400000
	HRRM PRJPRG
	MOVE 400225			; JOBNAM
	ADDI 400000
	HRRM JOBNAM
	MOVE X,400226			; JOB
	MOVE X,400000(X)
	MOVE L,400236			; JBTLIN
	ADDI L,400000(X)
	MOVE L,(L)
	CAMN L,[-1]
	 EXIT				; punt if detached
	MOVEI L,400000(L)
	ADD L,400302			; LINTAB
	MOVE L,(L)

; Fool around with the page printer

	HRROI [015000,,HSIZE]
	TTYSET
	PPSEL 1
	DPYPOS -452			; near botton of screen
	DPYSIZ 3002			; 3 glitches, 2 lines/glitch
; (continued on next page)
;GETSTA HDNODM NXTDDB NOJOB PIDLUP

GETSTA:	SETZB @SCREEN
	ADJSP @SCREEN
	AOS
	BLT @JOBREL
	MOVSI X,440700
	ADD X,SCREEN
	SETZM LINCNT
	MOVEI I,1
	TLNN (DMLIN)
	 JRST HDNODM
	MOVEI 177
	IDPB X
	MOVEI ↑W
	IDPB X
HDNODM:	JSP Y,TXTSTR
	 ASCIZ/Unit Job  User  Subsys  Proc-ID Status  WIO FIO LR LS Phone/
	PUSHJ P,TERPRI
NXTDDB:	MOVE DDB,@DLNUTB		; DDB addr
	ADDI DDB,400000
	MOVE Y,DEVNAM(DDB)		; device name
	PUSHJ P,SIXOUT
	MOVE J,400347			; PJOBN
	TLO J,DDB
	LDB J,J
	JUMPE J,[	JSP Y,TXTSTR
			 ASCIZ/                /
			JRST NOJOB]
	PUSHJ P,JOBOUT
NOJOB:	MOVEI <" >
	IDPB X
	MOVE Y,[441100,,DPID(DDB)]	; connected PID
	MOVEI Z,8.
PIDLUP: ILDB Y
	SKIPN
	 MOVEI <" >
	IDPB X
	SOJG Z,PIDLUP
	MOVEI <" >
	IDPB X
	MOVE J,DEVIOS(DDB)
	TRNE J,IO%INT
	 MOVEI <"I>
	IDPB X
	MOVEI <" >
	TRNE J,IO%CLS
	 MOVEI <"C>
	IDPB X
	MOVEI <" >
	TRNE J,IO%EOF
	 MOVEI <"E>
	IDPB X
	MOVEI <" >
	TRNE J,IO%DTM
	 MOVEI <"M>
	IDPB X
	MOVEI <" >
	TLNE J,IO%CON
	 MOVEI <"O>
	IDPB X
	MOVEI <" >
	TLNE J,IO%CCR
	 MOVEI <"D>
	IDPB X
	MOVEI <" >
	TLNE J,IO%RDY
	 MOVEI <"R>
	IDPB X
; (continued on next page)
;NOIWIN NOOWIN

; (continued from previous page)

	MOVE Y,DIWS(DDB)		; input window
	MOVEI N,2
	PUSHJ P,DECOUT
	MOVE Y,DOWS(DDB)		; output window
	MOVEI N,2
	PUSHJ P,DECOUT
	SKIPGE Y,DIWIN(DDB)		; input free
	 JRST [	JSP Y,TXTSTR
		 ASCIZ/ */
		JRST NOIWIN]
	MOVEI N,2
	PUSHJ P,DECOUT
NOIWIN:	SKIPGE Y,DOWIN(DDB)		; output free
	 JRST [	JSP Y,TXTSTR
		 ASCIZ/ */
		JRST NOOWIN]
	MOVEI N,2
	PUSHJ P,DECOUT
NOOWIN:	MOVE Y,DACK(DDB)		; last received
	MOVEI N,3
	PUSHJ P,OCTOUT
	MOVE Y,DSEQ(DDB)		; last sent
	MOVEI N,3
	PUSHJ P,OCTOUT
	MOVEI <" >
	IDPB X
	MOVEI Y,DNUM(DDB)		; phone number
	TLOA Y,440700
	 IDPB X
	ILDB Y
	JUMPN .-2
	PUSHJ P,TERPRI
	CAME I,DLNNUM
	 AOJA I,NXTDDB

; (continued on next page)
;CLREOF

; (continued from previous page)

; Statistics

	PUSHJ P,TERPRI
	JSP Y,TXTSTR
	 ASCIZ/Performance statistics:/
	PUSHJ P,TERPRI
	PUSHJ P,TERPRI
PERF NINPKT, total input packets
PERF NOUPKT,total output packets
PERF NORPKT,  re-xmitted packets
PERF NFRERR,      framing errors
PERF NCKERR,     checksum errors
PERF NRCERR,      ERR's received
PERF NSNERR,          ERR's sent
PERF NRNERR,      NAK's received
PERF NDOERR,  user data overruns
PERF NNSERR,     no FS at MAKPDB
PERF NRSERR,     no FS at REPFPL
PERF NDLERR,  dialer bit the bag
PERF NSQERR,     sequence errors
PERF NRPERR,   redundant packets
PERF NCRTRN, clock-level packets

	PUSHJ P,TERPRI
	JSP Y,TXTSTR
	 ASCIZ/Interpretation of status bits:/
	PUSHJ P,TERPRI
	JSP Y,TXTSTR
	 ASCIZ/ C Connection closing/
	PUSHJ P,TERPRI
	JSP Y,TXTSTR
	 ASCIZ/ E EOF signal raised/
	PUSHJ P,TERPRI
	JSP Y,TXTSTR
	 ASCIZ/ M Data missed due to receiver being too slow/
	PUSHJ P,TERPRI
	JSP Y,TXTSTR
	 ASCIZ/ O Connection open/
	PUSHJ P,TERPRI
	JSP Y,TXTSTR
	 ASCIZ/ D Carrier up/
	PUSHJ P,TERPRI
	JSP Y,TXTSTR
	 ASCIZ/ R Connection ready (saw at least one valid Dialnet packet)/
	PUSHJ P,TERPRI

; Clear to end of screen

	MOVE Z,HSIZE
	TLNE L,(DDDLIN\DMLIN)
CLREOF:	 CAMG Z,LINCNT
	  JRST NODDDM			; III or printing
	MOVEI <" >
	IDPB X
	PUSHJ P,TERPRI
	SOJA Z,CLREOF

; (continued on next page)
;NODDDM DOIII DODM DELAY NODLAY DELAY1

NODDDM:	TLNN X,700000			; if at word boundry
	 ADDI X,1
	SETZM 1(X)			; HALT to stop program
	MOVEI X,(X)
	MOVEI 2(X)
	SUBI @DPHEAD
	MOVEM DPHEAD+1			; save display program length
	AOS (X)
	CAME X,SCREEN
	 SOJA X,.-2

; Now output the accumulated text

	TLNN L,(DDDLIN\IIILIN\DMLIN)
	 JRST [	OUTSTR @SCREEN
		OUTSTR [ASCIZ/

/]
		JRST DELAY]
	JUMPL L,DOIII
	TLNE L,(DMLIN)
	 JRST [	SETZM @DPHEAD
		MOVE X,[.BYTE 7 ? 177 ? ↑L ? 140 ? 142]; cursor at third line
		JRST DODM]
	MOVE TXTOUT
	MOVEM @DPHEAD
	SKIPA X,COLPOS
DOIII:	 MOVE X,[.BYTE 11.,11.,3,3,2,2,4 ? -777 ? 640 ? 2 ? 2 ? 1 ? 2 ? 6]
DODM:	MOVEM X,@DPHEAD+3
	UPGIOT 1,DPHEAD			; display the text

; Done, wait a while and go again

DELAY:	SKIPE DELAYP
	 JRST NODLAY
	MOVEI 20.
	TLNE L,(DDDLIN\IIILIN)
	 MOVEI 1
	TLNE L,(DMLIN)
	 MOVEI 5.
	SLEEP
NODLAY:	SNEAKS
	 JRST GETSTA
	ANDI 177
	CAIN 175
	 JRST [INCHRW ? SETCMM DELAYP ? JRST GETSTA] ; ALT toggles the delay flag
	CAIN <" >
	 JRST [INCHRW ? INCHRW ? JRST GETSTA] ; space holds us
	CAIE ↑M
	 JRST DELAY1
	INCHRW				; only eat CRLF's
	INCHRW
DELAY1:	HRROI [004000,,400\"N]
	TTYSET
	EXIT
;TERPRI DECOUT OCTOUT NUMOUT NUMOU1 NUMOU2 NUMOU3 JOBOUT SIXOUT TXTSTR ...LIT

TERPRI:	JSP Y,TXTSTR
	 ASCIZ/
/
	AOS LINCNT
	TLNN (DMLIN)
	 POPJ P,
	MOVEI 177
	IDPB X
	MOVEI ↑W
	IDPB X
	POPJ P,

; Octal/decimal output of Y.  If N > 0, pad with spaces so it fits in N digits

DECOUT:	SKIPA Z,[10.]
OCTOUT:	 MOVEI Z,8.
	HRRM Z,NUMOUT			; I don't want to fry another AC
NUMOUT:	IDIVI Y,
	ADDI Z,"0
	PUSH P,Z
	SOSG N
	 JRST NUMOU1
	JUMPN Y,NUMOU2
	MOVEI Z,<" >
	IDPB Z,X
	SOJG N,.-1
	JRST NUMOU3
NUMOU1:	SKIPE Y
NUMOU2:	 PUSHJ P,NUMOUT
NUMOU3:	POP P,Y
	IDPB Y,X
	POPJ P,

; Job number/PPN/name output

JOBOUT:	MOVEI N,2
	MOVEI Y,(J)
	PUSHJ P,DECOUT
	MOVEI <" >
	IDPB X
	MOVE Y,@PRJPRG
	PUSHJ P,SIXOUT
	MOVEI <" >
	IDPB X
	MOVE Y,@JOBNAM
;	JRST SIXOUT

; Sixbit output routine

SIXOUT:	MOVEI N,6
	SETZ Z,
	ROTC Y,6
	ADDI Z,"A-'A
	IDPB Z,X
	SOJG N,SIXOUT+1
	POPJ P,

; Output text string, called with JSP

TXTSTR:	HRLI Y,440700
	ILDB Y
	JUMPE 1(Y)
	IDPB X
	JRST TXTSTR+1

...LIT:	CONSTA

END GO